#include "svdpi.h"
#include "switchboard.hpp"
#include <stdio.h>
#include <fstream>
#include <iostream>

extern "C" void hello() {
    printf("hello world\n");
}

// extern "C" void writefile(const svLogicVecVal* out, const svLogicVecVal* valid) {
//     int out_c = out;
//     int valid_c = valid;
//     std::fstream f;
// 	f.open("data_out.txt",std::ios::out  | std::ios::trunc); 
// 	f<<valid<<std::endl<<out_c<<std::endl;
// 	f.close();
// }

extern "C" void writefile_int(int out, int valid) {
    // int NBYTES = 32;
    // SBTX tx;
    // tx.init("data_out.q");
    // sb_packet txp;
    // txp.data[0] = valid;
    // txp.data[1] = out;
    // txp.destination = 0xbeefcafe;
    // txp.last = true;
    // printf("sending tx\n");
    // tx.send_blocking(txp);
    // printf("sending end\n");
    // printf("TX packet: %s\n", sb_packet_to_str(txp, NBYTES).c_str());

    int out_c = out;
    int valid_c = valid;
    std::fstream f;
	f.open("data_out.txt",std::ios::out  | std::ios::trunc); 
	f<<valid<<" "<<out_c<<std::endl;
    printf("cpp writes over\n");
    f.flush();
	f.close();
}

// extern "C" void readfile(svLogicVecVal *in_a, svLogicVecVal *in_b) {
//     int in_a_c, in_b_c;
//     std::fstream f;
// 	f.open("data_in.txt",std::ios::in); 
//      if (f >> in_a_c >> in_b_c) {
//         *in_a = in_a_c ;
//         *in_b = in_b_c ;
//     } else {
//         std::cerr << "Error: Failed to read data from file!" << std::endl;
//     }
// }

extern "C" void readfile_int(int *in_a, int *in_b, int *ready) {
    int in_a_c, in_b_c, ready_c;
    std::fstream f;
	f.open("data_in.txt",std::ios::in); 
    f.flush();
    if (f >> ready_c >> in_a_c >> in_b_c) {
        printf("cpp reads a=%d b=%d ready=%d\n",in_a_c,in_b_c,ready_c);
        *in_a = in_a_c ;
        *in_b = in_b_c ;
        *ready = ready_c;
    } else {
        std::cerr << "Error: Failed to read data from file!" << std::endl;
    }
}
